import winrm
import sys

def change_windows_password(windows_ip, username, current_password, new_password):
    """
    通过 WinRM 修改 Windows 本地管理员密码，并取消"密码永不过期"
    
    Args:
        windows_ip (str): Windows 服务器 IP 地址
        username (str): 管理员用户名（如 "Administrator"）
        current_password (str): 当前密码
        new_password (str): 新密码（需符合复杂度要求）
    
    Returns:
        bool: 是否修改成功
    """
    try:
        # 1. 建立 WinRM 会话
        target = f"http://{windows_ip}:5985/wsman"
        session = winrm.Session(
            target,
            auth=(username, current_password),
            transport="ntlm",
            read_timeout_sec=30,  # 增加读取操作数据超时时间
            operation_timeout_sec=25  # 增加执行超时时间
        )

        # 2. 取消"密码永不过期"（优先使用 wmic，兼容旧版 Windows）
        cmd_disable_password_expiry = (
            f'wmic UserAccount where Name="{username}" set PasswordExpires=True'
        )
        result = session.run_cmd(cmd_disable_password_expiry)

        if result.status_code != 0:
            print(f"[WARNING] wmic 取消密码永不过期失败，尝试 PowerShell 备选方案...")
            ps_disable_password_expiry = (
                f'Set-LocalUser -Name "{username}" -PasswordNeverExpires $false'
            )
            result = session.run_ps(ps_disable_password_expiry)
            if result.status_code != 0:
                print(f"[ERROR] 取消密码永不过期失败！服务器: {windows_ip} 账户：{username}")
                print(f"wmic 错误: {result.std_err.decode().strip()}")
                return False

        print(f"[SUCCESS] 已取消密码永不过期！服务器: {windows_ip} 账户：{username}")

        # 3. 修改密码（使用 net user，兼容所有 Windows 版本）
        cmd_change_password = f'net user {username} "{new_password}"'
        result = session.run_cmd(cmd_change_password)

        if result.status_code != 0:
            print(f"[ERROR] 密码修改失败！服务器: {windows_ip} 账户：{username}")
            print(f"错误: {result.std_err.decode().strip()}")
            return False

        print(f"[SUCCESS] 密码修改成功！服务器: {windows_ip} 账户：{username} 新密码：{new_password}")
        return True

    except winrm.exceptions.WinRMTransportError as e:
        print(f"[ERROR] WinRM 连接失败！请检查: \n"
              f"1. 目标服务器 {windows_ip} 是否开启 WinRM\n"
              f"2. 防火墙是否放行 5985 端口\n"
              f"3. 用户名/密码是否正确\n"
              f"详细错误: {e}")
        return False

    except Exception as e:
        print(f"[ERROR] 未知错误: {e}")
        return False

if __name__ == "__main__":
    # 配置参数（建议从配置文件或命令行读取，避免硬编码）
    WINDOWS_SERVER = "10.60.20.63"
    USERNAME = "Administrator"
    CURRENT_PASSWORD = "RKq7_}1z8ogwLs,e"
    NEW_PASSWORD = "wcq@2020lms"

    # 执行密码修改
    success = change_windows_password(
        windows_ip=WINDOWS_SERVER,
        username=USERNAME,
        current_password=CURRENT_PASSWORD,
        new_password=NEW_PASSWORD
    )

    # 根据结果退出（可用于自动化脚本的返回值判断）
    sys.exit(0 if success else 1)